dgraymanfandomcom_it-20200213-history
Modulo:Interprogetto
Modulo per implementare le funzionalità di template:Interprogetto local p = {} -- per l'esportazione delle funzioni del modulo local progetti={} -- dati da usare per la costruzione delle righe dell'elenco di link ai progetti local root -- radice del markup html local debug= {} -- per debug local function dump(t, ...) local args = {...} for _, s in ipairs(args) do table.insert(t, s) end end local function add_space(s) --ritorna uno spazio se l'ultimo carattere non è un accento if mw.ustring.sub(s, -1) "'" then return '' else return ' ' end end local function is_defined(s) -- ritorna la stringa se è definita e diversa da stringa nulla, altrimenti nil if s and s ~= '' then return s end return nil end local function Link(intext, pos, in_stampa) -- Restituisce il link nel caso normale di collegamento (progetto senza interfaccia in lingua) -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra local p=progetti local text='' if intext then if in_stampa then text = table.concat({'* ", p.messaggio_stampapos, "", p.base_urlpos, tostring(mw.uri.localUrl( p.collegamentopos )), "" }) else text = table.concat({'* ", ' ', "[p.prefix[pos, '|', p.nome_progettopos, "]] contiene ", p.oggettopos, ' ', p.linguapos, p.preposizionepos, add_space(p.preposizionepos), p.testo_primapos, "[p.prefix[pos, p.collegamentopos, '|', p.etichettapos, "]]", p.testo_dopopos }) end else text = table.concat({'[p.prefix[pos, p.collegamentopos, '|', p.nome_leftbarpos or p.nome_progettopos, ']]'}) end return text end local function LinkRicette(intext, pos, in_stampa) -- Restituisce il link per le ricette su wikibook -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra local p=progetti local text='' if intext then if in_stampa then text = table.concat({'* ", p.messaggio_stampapos, "", p.base_urlpos, tostring(mw.uri.localUrl( p.prefixpos .. p.collegamentopos )), "" }) else text = table.concat({'* Il Libro di cucina di Wikibooks contiene [p.prefix[pos, p.collegamentopos, "|ricette]]", " relative a questo argomento." }) end else text = table.concat({'[p.prefix[pos, p.collegamentopos, '|', p.nome_leftbarpos or p.nome_progettopos, ']]'}) end return text end local function LinkWithLanguage(intext, pos, in_stampa) -- Restituisce il link verso progetti con interfaccia in lingua (seleziona automaticamente quella italiana) -- intext vero se è richiesto il link del testo principale, falso per la barra sinistra local p=progetti local text='' if intext then if in_stampa then text = table.concat({'* ", p.messaggio_stampapos, "", p.base_urlpos, tostring(mw.uri.localUrl( p.collegamentopos )), "" }) else main_page_link=tostring(mw.uri.fullUrl(p.prefixpos , {uselang='it'})) text = table.concat({'* ", ' ', "main_page_link, ' ', p.nome_progetto[pos, "] contiene ", p.oggettopos, ' ', p.preposizionepos, add_space(p.preposizionepos), p.testo_primapos, "tostring(mw.uri.fullUrl(p.prefix[pos .. p.collegamentopos, {uselang='it'})), ' ', p.etichettapos, "]", p.testo_dopopos }) end else text = table.concat({'tostring(mw.uri.fullUrl(p.prefix[pos .. p.collegamentopos, {uselang='it'})), ' ', p.nome_leftbarpos or p.nome_progettopos, ']'}) end return text end local function LinkIncubator(intext, pos, in_stampa) -- Restituisce il link verso progetti per incubator local p=progetti local text='' local prefix = { wikipedia = 'Wp', wiktionary = 'Wt', wikizionario= 'Wt', wikibooks= 'Wb', wikinews= 'Wn', wikinotizie= 'Wn', wikiquote= 'Wq', } local oggetto = p.oggettopos if not prefixoggetto then oggetto='wikipedia' end local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', prefixoggetto, '/', p.collegamentopos}), {uselang='it'})) if intext then if in_stampa then text = table.concat({'* ", p.messaggio_stampapos, "", collegamento, "" }) else local main_page_incubator=tostring(mw.uri.fullUrl(':incubator:Main_Page/it', {uselang='it'})) local main_page_progetto = '' if oggetto 'wikipedia' then main_page_progetto = 'Wikipedia' else main_page_progetto = table.concat({'', oggetto:gsub("^%l", string.upper), ''}) end text = table.concat({'* main_page_incubator, " Incubator contiene un test su ", main_page_progetto, ' ', p.preposizionepos, add_space(p.preposizionepos), 'collegamento, ' ', p.etichetta[pos, ']' }) end else text = table.concat({'collegamento, ' Incubator'}) end return text end function Link_vuoto(intext, pos) -- per il parametro notizia, non dovrebbe mai essere chiamato, ma giusto in caso restituisce -- una stringa vuota return '' end -- default_parameter: contiene i valori di default dei parametri -- priorità: ordine di priorità in cui visualizzare il link (un numero intero) -- funzione da richiamare per inserire i link -- prefisso_progetto: prefisso da usare per i link del progetto -- nome_progetto: nome del progetto -- nome_leftbar: nome da usare per il collegamento nella barra di sinistra (falso se coincide con -- il nome del progetto, altrimenti una stringa, da usare per esempio per wikiricette) -- logo del progetto: nome del file che contiene il logo del progetto -- dimensioni del logo: dimensioni da usare per il logo -- oggetto standard: per il contenuto ('opere originali', 'testi o manuali', ecc..). -- preposizione standard: da mettere prima dell'etichetta ('di o su', 'relative a questo argomento', ecc..), -- se è false non viene sostituita -- testo di apertura intorno all'etichetta: stringa vuota o testo da usare immediatamente prima del -- collegamento (usate dal wikizionario per la virgoletta di -- apertura e da wikiricette per non inserire niente) -- testo di chiusura intorno all'etichetta: stringa vuota o testo di chiusura da usare immediatamente -- dopo il collegamento (usate dal wikizionario per la virgoletta -- di chiusura e da wikiricette per scrivere " relative a questo argomento") -- lingua originale: lingua di un testo linkato (false se non è possibile impostarla, true per -- i progetti per cui si può impostare. -- da usare per i progetti che prevedono l'inserimento di "in xxxxx" tra il nome -- del progetto e l'etichetta standard per il tipo di contenuto) local default_parameter ={ wikisource = {1, Link, 'wikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', , '', false, "'Wikisource''' contiene opere originali in inglese: ", 'http://en.wikisource.org'}, s = {2, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', , '', true, "'Wikisource''' contiene opere originali: ", "http://it.wikisource.org"}, s2 = {3, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', , '', true, "'Wikisource''' contiene opere originali: ", "http://it.wikisource.org"}, testo = {4, Link, 's:', 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'il testo completo', 'di o su', , '', true, "'Wikisource''' contiene opere originali: ", "http://it.wikisource.org"}, oldwikisource = {5, Link, 'oldwikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', , '', true, "'Wikisource''' contiene opere originali: ", "http://it.wikisource.org"}, wikiquote = {6, Link, 'wikiquote:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', , '' , false, "'Wikiquote''' contiene citazioni in inglese: ", "http://en.wikiquote.org"}, q = {7, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', , '' , true, "'Wikiquote''' contiene citazioni: ", "http://it.wikiquote.org"}, q2= {8, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', , '' , true, "'Wikiquote''' contiene citazioni: ", "http://it.wikiquote.org"}, wikibooks = {9, Link, 'wikibooks:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', , '' , false, "'Wikibooks''' contiene testi o manuali in inglese: ", "http://en.wikibooks.org"}, b = {10, Link, 'b:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', , '' , false, "'Wikibooks''' contiene testi o manuali:", "http://it.wikibooks.org"}, ricetta = {11, LinkRicette, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Ricette', 'Wikibooks-logo.svg', '22px', , '', '', '' , false, "'Wikibooks''' contiene la ricetta: ", "http://it.wikibooks.org"}, wiktionary = {12, Link, 'wiktionary:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "Wikizionario contiene la voce di dizionario in inglese:", "http://en.wiktionary.org"}, wikt = {13, Link, 'wikt:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "Wikizionario contiene la voce di dizionario: ","http://it.wiktionary.org" }, v = {14, Link, 'v:', 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', , '', false, "'Wikiversità''' contiene informazioni: ", "http://it.wikiversity.org"}, wikinews = {15, Link, 'wikinews:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', , '', false, "'Wikinotizie''' contiene notizie di attualità in inglese: ", "http://en.wikinews.org"}, n = {16, Link, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', , '', false, "'Wikinotizie''' contiene notizie di attualità: ", "http://it.wikinews.org"}, commons = {17, LinkWithLanguage, 'commons:', 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', , '', false, "'Wikimedia Commons''' contiene file multimediali: ", "http://commons.wikimedia.org"}, meta = {18, LinkWithLanguage, 'meta:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', , '', false, "'Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"}, m = {19, LinkWithLanguage, 'm:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', , '', false, "'Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"}, wikispecies = {20, LinkWithLanguage, 'wikispecies:', 'Wikispecies', false, 'WikiSpecies notext.svg', '21px', 'informazioni', 'su', , '', false, "'Wikispecies''' contiene informazioni: ", "http://species.wikimedia.org"}, voy = {21, Link, 'voy:', 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', , '', false, "'Wikivoyage''' contiene informazioni turistiche: ", "http://it.wikiwoyage.org"}, mw = {22, LinkWithLanguage, 'mw:', 'Mediawiki', false, 'MediaWiki-notext.svg', '21px', 'informazioni', 'su', , '', false, "'Mediawiki''' contiene informazioni: ", "http://www.mediawiki.org"}, incubator = {23, LinkIncubator, 'incubator:', 'Incubator', false, 'Incubator-notext.svg', '18px', 'wikipedia', 'in', , '', false, " '''Wikimedia' Incubator contiene un test: ", "http://incubator.wikimedia.org"}, wikidata = {24, Link, 'wikidata:', 'Wikidata', false, 'Wikidata-logo.svg', '18px', 'dati', 'su', , '', false, "'Wikidata''' contiene dati su:", 'https://www.wikidata.org'}, notizia = {0, Link_vuoto, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', , '', ': ', '', false, "'Wikinotizie''' contiene notizie di attualità: ", 'http://it.wikinews.org'}, } --tabella link gestiti in automatico se assenti, basandosi su wikidata --formata da coppie 'nome progetto' (come compare nella tabella sopra) e nome proprietà su wikidata con il link al progetto local automatic_link = { voy = {interwiki='itwikivoyage', category=nil }, commons= {interwiki='commonswiki', category=nil }, s= {interwiki='itwikisource', category=nil }, q= {interwiki='itwikiquote', category=nil }, n= {interwiki='itwikinews', category=nil } } local automatic_link_bis = { -- Tabella delle corrispondenze tra i "codici progetto" (come compaiono nella tabella sopra). -- Evita che wikidata aggiunga il link automatico se esiste già un link a uno di questi progetti testo = 's' } local check_property = { commons = 'P373' } local function sort_by_first(t1, t2) -- per ordinare una tabella in base al valore del primo elemento della tabella if t11 < t21 then return true end end local function RenderLeftBar() -- Crea la barra di sinistra con i link interprogetto -- costruisce le righe per la barra di sinistra come un elenco puntato -- Apertura del tag div id="interProject" (vedi Commons:MediaWiki:InterProject.js incluso da Mediawiki:Common.js) local leftbar = mw.html.create('div'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia') for i = 1, #progetti.ordine do local pos = progetti.ordinei2 local link =progetti.linkpos leftbar:newline() leftbar:wikitext(' ') leftbar:wikitext(link(false, pos)) if progetti.nome_leftbarpos then leftbar:wikitext(' (', progetti.nome_progettopos, ')') end leftbar:wikitext(' ') end root :tag('div') :attr('id', 'interProject') :cssText('display: none; clear: both; border-width: 2px 0; border-style: dotted; border-color: #AAAAAA; margin-top: 2em') :tag('p') :attr('id', 'sisterProjects') :cssText('background-color: #efefef; font-weight: bold; margin: 0 0 -0.2em') :tag('span') :wikitext('Altri progetti') :done() :done() :node(leftbar) end local function RenderLinksInText(in_stampa) -- Scandisce la tabella progetti e produce il codice html per l'elenco puntato for i = 1, #progetti.ordine do local pos = progetti.ordinei2 root:newline() local link=progetti.linkpos root:wikitext(link(true, pos, in_stampa)) end end function p.interprogetto(frame) local origArgs -- Se chiamata mediante #invoke, usa gli argomenti passati al template invocante. -- Altrimenti a scopo di test assume che gli argomenti siano passati direttamente if frame mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame.args end local in_stampa = false if frame.args'stampa' then in_stampa = true end -- Carico i parametri local current_page = mw.title.getCurrentTitle() local current_namespace = current_page.namespace local current_pagename = current_page.text local current_fullpagename = '' -- Per i namespace uso il nome canonico (inglese) per non avere differenze tra progetti: -- esempio: Utente/User, Categoria/Category, ma anche Wikiquote/Wikipedia (Project), ecc. if current_namespace ~= 0 then current_fullpagename = mw.site.namespacescurrent_namespace.canonicalName .. ':' .. current_pagename else current_fullpagename = current_pagename end local etichetta = origArgs.etichetta -- carico i dati da wikidata se esistono local entity = nil if mw.wikibase then entity = mw.wikibase.getEntityObject() end -- se esiste l'etichetta su wikidata uso questa come etichetta di default dei collegamenti local etichetta_lower if (etichetta nil or etichetta ) then if entity and entity.labels and entity.labels.it and entity.labels.it.value ~= '' then etichetta = mw.ustring.gsub(entity.labels.it.value, '^Categoria:', '') -- Elimino un eventuale "Categoria:" in fronte del nome else etichetta = mw.ustring.gsub(current_pagename, ' %(.*%)$', '') -- Elimino un'eventuale disambigua dal nome if current_namespace 0 then etichetta_lower = etichetta:gsub("^%l", string.lower) end -- converto l'iniziale dell'etichetta in minuscolo end end local preposizione = origArgs.preposizione local oggetto = origArgs.oggetto -- se preposizione e oggetto non sono definiti cambio il valore di default if current_namespace 14 then preposizione = preposizione or "sull'argomento" oggetto = oggetto or "una categoria" end progetti = { ordine = {}, link = {}, prefix = {}, nome_progetto = {}, nome_leftbar = {}, badge_leftbar = {}, collegamento = {}, etichetta = {}, icona = {}, dimensione_icona = {}, oggetto = {}, preposizione = {}, testo_prima = {}, testo_dopo = {}, lingua = {}, messaggio_stampa = {}, base_url = {} } local pos = 0 local notizia_presente = false local incubator_without_value = false local add_categories = {} local is_disambigua = false -- Check if the page is a disambiguation page -- The costant 4167410 is the wikidata item 'Wikimedia disambiguation page': https://www.wikidata.org/wiki/Q4167410 local istance_of = 'P31' -- wikidata property "Istance of", https://www.wikidata.org/wiki/Property:P31 if entity and entity.claims and entity.claimsistance_of and entity.claimsistance_of1 and entity.claimsistance_of1.mainsnak and entity.claimsistance_of1.mainsnak.datavalue and entity.claimsistance_of1.mainsnak.datavalue.type 'wikibase-entityid' and entity.claimsistance_of1.mainsnak.datavalue.value and entity.claimsistance_of1.mainsnak.datavalue.value'entity-type' 'item' and entity.claimsistance_of1.mainsnak.datavalue.value'numeric-id' 4167410 then is_disambigua = true end -- carico tutti i dati in una nuova tabella e controllo se i valori per i link presenti nella -- tabella automatic_link sono definiti, in caso contrario provo a leggere il link da wikidata local automatic_found = {} for key, _ in pairs(automatic_link) do automatic_foundkey = false end local newArgs = {} for k, value in pairs(origArgs) do -- Disabilito i link a wikidata per le voci (ns0), escludendo la Pagina principale if not(k 'wikidata' or value 'wikidata') or current_namespace ~= 0 or current_pagename 'Pagina principale' then -- Se è disambigua registro solo i valori per i link al wikizionario if k 'wikt' or value 'wikt' or not(is_disambigua) then newArgsk = value end end if automatic_linkk then automatic_foundk = true elseif automatic_link_bisk then automatic_found[automatic_link_bisk] = true elseif (tonumber(k) and automatic_linkmw.text.trim(value)) then automatic_foundmw.text.trim(value) = true elseif tonumber(k) and automatic_link_bismw.text.trim(value) then automatic_found[automatic_link_bismw.text.trim(value)] = true end end for key, found in pairs(automatic_found) do if not (found) then if not (is_disambigua) and entity then if entity.sitelinks and entity.sitelinks[automatic_linkkey.interwiki] then newArgskey = entity.sitelinks[automatic_linkkey.interwiki].title if automatic_linkkey.category then add_categories#add_categories+1 = automatic_linkkey.category end elseif check_propertykey and entity.claims and entity.claims[check_propertykey] and entity.claims[check_propertykey]1 and entity.claims[check_propertykey]1.mainsnak and entity.claims[check_propertykey]1.mainsnak.datavalue and entity.claims[check_propertykey]1.mainsnak.datavalue.type 'string' then newArgskey = 'Category:' .. entity.claims[check_propertykey]1.mainsnak.datavalue.value end end end end -- Per i link gestiti in automatico da wikidata, verifico i badge per la segnalazione delle voci in vetrina e di qualità local badge_link = {} if entity and entity.sitelinks then for key, _ in pairs(automatic_link) do if entity.sitelinks[automatic_linkkey.interwiki] and entity.sitelinks[automatic_linkkey.interwiki].badges then badge_linkkey = '' for i = 1, #entity.sitelinks[automatic_linkkey.interwiki].badges do if entity.sitelinks[automatic_linkkey.interwiki].badgesi 'Q17437796' then badge_linkkey = 'badge-Q17437796 badge-featuredarticle ' .. badge_linkkey elseif entity.sitelinks[automatic_linkkey.interwiki].badgesi 'Q17437798' then badge_linkkey = badge_linkkey .. ' badge-Q17437798 badge-goodarticle' end end end end end -- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link -- a un altro progetto con le opzioni che sono state settate per quel progetto for k, collegamento in pairs(newArgs) do -- controlla se è un parametro posizionale e in questo caso usa il suo valore come nome del -- progetto a cui puntare, con pagina corrispondente a quella della pagina corrente -- in cui è inserito il template if tonumber(k) then k = mw.text.trim(collegamento) -- elimino eventuali spazi iniziali e finali if k 'incubator' then k = '' incubator_without_value = true -- se incubator non è valorizzato loggo l'errore else if k 'wikt' or k 'wiktionary' then -- di default il collegamento a wikizionario è in minuscolo collegamento = current_fullpagename:gsub("^%u", string.lower) else collegamento = current_fullpagename end end end if collegamento '' then collegamento = current_fullpagename end -- se k corrisponde a un progetto inserito in default_parameter aggiungo una riga alla tabella -- progetti con i parametri da usare per visualizzare i collegamenti if default_parameterk then pos = pos+1 progetti.ordinepos = {default_parameterk1, pos} progetti.linkpos = default_parameterk2 progetti.prefixpos = default_parameterk3 progetti.nome_progettopos = default_parameterk4 progetti.nome_leftbarpos = default_parameterk5 progetti.badge_leftbarpos = is_defined(badge_linkk) or '' progetti.collegamentopos = collegamento progetti.etichettapos = is_defined(newArgs.. '_etichetta') or (k 'wikt' and etichetta_lower) or etichetta progetti.iconapos = default_parameterk6 progetti.dimensione_iconapos = default_parameterk7 progetti.oggettopos = newArgs.. '_oggetto' or oggetto or default_parameterk8 if default_parameterk9 then progetti.preposizionepos = newArgs.. '_preposizione' or preposizione or default_parameterk9 else progetti.preposizionepos = '' end progetti.testo_primapos = default_parameterk10 progetti.testo_dopopos = default_parameterk11 if k 'notizia' then notizia_presente = true if newArgs.data then progetti.testo_dopopos = table.concat({' ', newArgs.data, ''}) end end if default_parameterk12 and newArgs..'_lingua' then progetti.linguapos = table.concat({' in lingua ', newArgs..'_lingua', ' '}) else progetti.linguapos = ' ' end progetti.messaggio_stampapos = default_parameterk13 progetti.base_urlpos = default_parameterk14 end end root = mw.html.create() if notizia_presente then -- gestisco il parametro "notizia" a parte if #progetti.ordine>1 then root:wikitext('Errore: il parametro "notizia" se presente deve essere unicoCategoria:Errori di compilazione del template Interprogetto') else if in_stampa then root:wikitext('* ", progetti.messaggio_stampa1, "", progetti.base_url1, tostring(mw.uri.localUrl(progetti.collegamento1 )), "" ) else root:wikitext('* ", " Articolo su [progetti.prefix[1, progetti.nome_progetto1, '|', progetti.nome_progetto1, "]]: ", "[progetti.prefix[1, progetti.collegamento1, '|', progetti.collegamento1, "]]", progetti.testo_dopo1 ) end end else if #progetti.ordine > 0 then table.sort(progetti.ordine, sort_by_first) if not(in_stampa) then RenderLeftBar() end if not(newArgs1) or mw.text.trim(newArgs1)~= 'nolink' then RenderLinksInText(in_stampa) end if #add_categories > 0 then for _,category in ipairs(add_categories) do root:wikitext('Categoria:' .. category .. '') end end end end if incubator_without_value then root:wikitext('Errore: il parametro "incubator" deve essere valorizzatoCategoria:Errori di compilazione del template Interprogetto') end return tostring(root) end return p